
/**
 * 获取各种浏览器的类型、内核、外壳、版本号等信息
 */
(function (window,undefined){
	
	var document=window.document,
	navigator=window.navigator,
	location=window.location;
	
	var ua = navigator.userAgent.toLowerCase();
	var lang = (navigator.language ? navigator.language : navigator.userLanguage || "");
	
	var jBrowser=(function (){
		
		var _theversion = "1.0.0";//当前使用的jBrowser版本
		
		var _jBrowser = window.jBrowser;
		
		// 定义一个jBrowser的本地副本，局部变量
		var jBrowser = function (){
			return new jBrowser.fn.init();
		};
		
		/**
		 * 浏览器内核引擎类型与对应的正则表达式
		 * 扩展阅读：
		 * http://baike.baidu.com/view/1369399.htm（浏览器内核）
		 * http://www.iplaysoft.com/browsers-engine.html（关于浏览器内核的一些小知识，明明白白选浏览器！）
		 * http://blog.sina.com.cn/s/blog_44d4a64b01014i9u.html（不同设备浏览器的userAgent值大全）
		 */
		
		/**
		 * Trident内核：
		 * 常见的Trident内核浏览器：
		 * IE6（Trident 3.0）、IE7（Trident 4.0）、IE8（Trident 4.0）、IE9（Trident 5.0）、IE10（Trident 6.0）；
		 * 360安全浏览器、傲游Maxthon、腾讯TT、世界之窗、瑞星安全浏览器、GreenBrowser、
		 * 阿云浏览器（早期版本）、百度浏览器（早期版本）、115浏览器、糖果浏览器等。
		 * 其中部分浏览器的新版本是“双核”甚至是“多核”，其中一个内核是Trident，然后再增加一个其他内核。
		 * 国内的厂商一般把其他内核叫做“高速浏览模式”，而Trident则是“兼容浏览模式”，用户可以来回切换。
		 */
		var _tr = _trident = /trident/i;
		/**
		 * KHTML内核：
		 * 常见的KHTML内核浏览器：Konqueror
		 */
		var _kh = _khtml = /khtml/i;
		/**
		 * WebKit|Chromium内核：其实，WebKit是由KHTML衍生而来。而Chromium就是WebKit，维基百科上并没有将Chromium从WebKit分出来。
		 * 常见的WebKit内核浏览器：Apple Safari (Win/Mac/iPhone/iPad)、Symbian手机浏览器、Android 默认浏览器。
		 * 常见的Chromium内核的浏览器：Google Chrome、Chromium、SRWare Iron、Comodo Dragon、极速类高速类浏览器（如360极速）
		 */
		var _wk = _webkit = /webkit/i;
		var _wk_v = _webkit_v = /webkit[ \/]([\w.]+)/i;
		/**
		 * Gecko内核：
		 * 常见的Gecko内核浏览器：Mozilla Firefox、Mozilla SeaMonkey、Epiphany（早期版本）、Flock（早期版本）、K-Meleon等。
		 */
		var _ge = _gecko = /gecko/i;
		/**
		 * Presto内核：
		 * 常见的Presto内核浏览器：Opera7+
		 */
		var _pr = _presto = /opera/i;
		
		/**
		 * 各种浏览器及获取版本号的正则表达式
		 */
		//IE
		var _ie = /msie/i;
		var _ie_v = /msie ([\w.]+)/i;
		//FireFox
		var _ff = /firefox/i;
		var _ff_v = /firefox[ \/]([\w.]+)/i;
		//Chrome
		var _ch = _chrome = /chrome/i;
		var _ch_v = _chrome_v = /chrome[ \/]([\w.]+)/i;
		//Safari
		var _sa = _safari = /safari/i;//注意：Webkit内核浏览器中不含有"chrome"的才是Safari浏览器，因此需要先判断是否含有"chrome"字符串。
		var _sa_v0 = _safari_v0 = /(?:version)[ \/]([\w.]+)/i;
		var _sa_v1 = _safari_v1 = /safari[ \/]([\w.]+)/i;//上面获取不了版本号，就使用这种方式
		//Opera
		var _op = _opera = /opera/i;
		var _ov_v = _opera_v = /opera(?:.*version|)[ \/]([\w.]+)/i;

		//统一处理（此段代码来自http://code.jquery.com/jquery-migrate-1.2.1.js）
		var uaMatch = /(chrome)[ \/]([\w.]+)/i.exec( ua ) ||
			/(webkit)[ \/]([\w.]+)/i.exec( ua ) ||
			/(opera)(?:.*version|)[ \/]([\w.]+)/i.exec( ua ) ||
			/(firefox)[ \/]([\w.]+)/i.exec( ua ) ||
			/(msie) ([\w.]+)/i.exec( ua ) ||
			ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/i.exec( ua ) ||
			[];
		
		/**
		 * 浏览器客户端的各种操作系统
		 */
		//Windows操作系统
		var _windows = /windows[ \/]nt/i;
		//Linux操作系统
		var _linux = /linux/i;//备注：手机的Android系统虽然是Linux内核，但这里不列为Linux系统。
		//MAC操作系统
		var _mac = /macintosh/i;
		//Android手机或平板
		var _android = /android/i;
		//iPhone手机
		var _iphone = /iphone/i;
		//iPad平板
		var _ipad = /ipad/i;
		//IOS系统：iPhone手机+iPad平板
		var _ios = /ipad|iphone/i;
		
		/**
		 * 重要：定义jBrowser的原型
		 */
		jBrowser.fn = jBrowser.prototype = {
			
			//定义构造器调用的函数，其实还是调用了下面的init方法，见#11行的定义
			constructor :jBrowser,
			
			/**
			 * 初始化返回当前对象
			 */
			init:function (){
				return this;
			},

			/**
			 * 当前使用的jBrowser版本
			 * 用法：alert("jBrowser版本："+jBrowser().version);
			 */
			version : _theversion
			
		};
		
		/**
		 * 当前使用的jBrowser版本
		 * 用法：alert("jBrowser版本："+jBrowser.version);
		 */
		jBrowser.version = _theversion;
		
		jBrowser.ua = ua;
		jBrowser.lang = lang;
		
		/**
		 * 是否IE浏览器：是为true，否为false
		 */
		jBrowser.ie = _ie.test( ua );
		
		//获取IE版本号
		if(jBrowser.ie){
			jBrowser.ie_v = ( (_ie_v.exec( ua ))[ 1 ] || "0" );//完整版本号：字符串类型，带有小数点.
			jBrowser.ie_vi = parseInt(jBrowser.ie_v);//主版本号：整型
		}else{
			jBrowser.ie_v = "0";
			jBrowser.ie_vi = 0;
		}
		
		/**
		 * 是否FireFox浏览器：是为true，否为false
		 */
		jBrowser.ff = jBrowser.firefox = _ff.test( ua );
		
		//获取FF版本号
		if(jBrowser.ff){
			jBrowser.ff_v = jBrowser.firefox_v = ( (_ff_v.exec( ua ))[ 1 ] || "0" );//完整版本号：字符串类型，带有小数点.
			jBrowser.ff_vi = jBrowser.firefox_vi = parseInt(jBrowser.firefox_v);//主版本号：整型
		}else{
			jBrowser.ff_v = jBrowser.firefox_v = "0";
			jBrowser.ff_vi = jBrowser.firefox_vi = 0;//主版本号：整型
		}
		
		/**
		 * 是否Webkit内核：是为true，否为false
		 */
		jBrowser.wk = jBrowser.webkit = _webkit.test( ua );
		
		//获取Webkit内核版本号
		if(jBrowser.webkit){
			jBrowser.wk_v = jBrowser.webkit_v = ( (_webkit_v.exec( ua ))[ 1 ] || "0" );//完整版本号：字符串类型，带有小数点.
			jBrowser.wk_vi = jBrowser.webkit_vi = parseInt(jBrowser.webkit_v);//主版本号：整型
		}else{
			jBrowser.wk_v = jBrowser.webkit_v = "0";
			jBrowser.wk_vi = jBrowser.webkit_vi = 0;//主版本号：整型
		}
		
		/**
		 * 是否Chrome浏览器：是为true，否为false
		 */
		jBrowser.ch = jBrowser.chrome = _chrome.test( ua );
		
		//获取Chrome版本号
		if(jBrowser.chrome){
			jBrowser.ch_v = jBrowser.chrome_v = ( (_chrome_v.exec( ua ))[ 1 ] || "0" );//完整版本号：字符串类型，带有小数点.
			jBrowser.ch_vi = jBrowser.chrome_vi = parseInt(jBrowser.chrome_v);//主版本号：整型
		}else{
			jBrowser.ch_v = jBrowser.chrome_v = "0";
			jBrowser.ch_vi = jBrowser.chrome_vi = 0;//主版本号：整型
		}
		
		/**
		 * 是否Safari浏览器：是为true，否为false
		 */
		jBrowser.sa = jBrowser.safari = _safari.test( ua ) && (!/chrome/i.test( ua ));
		
		//获取Safari版本号
		if(jBrowser.safari){
			jBrowser.sa_v = jBrowser.safari_v = ( (_safari_v0.exec( ua ))[ 1 ] || (_safari_v1.exec( ua ))[ 1 ] || "0" );//完整版本号：字符串类型，带有小数点.
			jBrowser.sa_vi = jBrowser.safari_vi = parseInt(jBrowser.safari_v);//主版本号：整型
		}else{
			jBrowser.sa_v = jBrowser.safari_v = "0";
			jBrowser.sa_vi = jBrowser.safari_vi = 0;//主版本号：整型
		}
		
		/**
		 * 是否Opera浏览器：是为true，否为false
		 */
		jBrowser.op = jBrowser.opera = _opera.test( ua );
		
		//获取Opera版本号
		if(jBrowser.opera){
			jBrowser.op_v = jBrowser.opera_v = ( (_opera_v.exec( ua ))[ 1 ] || "0" );//完整版本号：字符串类型，带有小数点.
			jBrowser.op_vi = jBrowser.opera_vi = parseInt(jBrowser.opera_v);//主版本号：整型
		}else{
			jBrowser.op_v = jBrowser.opera_v = "0";
			jBrowser.op_vi = jBrowser.opera_vi = 0;//主版本号：整型
		}

		/**
		 * 统一处理
		 */
		jBrowser.t = jBrowser.bt = jBrowser.browserType = uaMatch[ 1 ] || "未知浏览器";
		jBrowser.v = jBrowser.bv = jBrowser.browserVersion = uaMatch[ 2 ] || "0";//完整版本号：字符串类型，带有小数点.
		jBrowser.vi = jBrowser.bvi = jBrowser.browserVersionInt = parseInt(jBrowser.bv);//主版本号：整型
		//Safari属于特殊情况
		if(jBrowser.safari){
			jBrowser.t = jBrowser.bt = jBrowser.browserType = "safari";
			jBrowser.v = jBrowser.bv = jBrowser.browserVersion = jBrowser.sa_v;
			jBrowser.vi = jBrowser.bvi = jBrowser.browserVersionInt = parseInt(jBrowser.sa_v);//主版本号：整型
		}
		
		jBrowser.browser = {
			b: uaMatch[ 1 ] || "未知浏览器",
			browser: uaMatch[ 1 ] || "未知浏览器",
			v: uaMatch[ 2 ] || "0",//完整版本号：字符串类型，带有小数点.
			version: uaMatch[ 2 ] || "0",
			vi: (uaMatch[ 2 ] ? parseInt(uaMatch[ 2 ]) : 0)//主版本号：整型
		};

		/**
		 * 是否Trident内核：是为true，否为false
		 */
		if(jBrowser.ie||_trident.test(ua)){
			jBrowser.tr = jBrowser.trident = true;
		}else{
			jBrowser.tr = jBrowser.trident = false;
		}

		/**
		 * 是否KHTML内核：是为true，否为false
		 */
		if(_khtml.test(ua)){
			jBrowser.kh = jBrowser.khtml = true;
		}else{
			jBrowser.kh = jBrowser.khtml = false;
		}

		/**
		 * 是否Gecko内核：是为true，否为false
		 */
		if((!jBrowser.webkit)&&_gecko.test(ua)){
			jBrowser.ge = jBrowser.gecko = true;
		}else{
			jBrowser.ge = jBrowser.gecko = false;
		}

		/**
		 * 是否Presto内核：是为true，否为false
		 */
		if(jBrowser.opera||_presto.test(ua)){
			jBrowser.pr = jBrowser.presto = true;
		}else{
			jBrowser.pr = jBrowser.presto = false;
		}

		/**
		 * 是否Windows操作系统：是为true，否为false
		 */
		jBrowser.windows = _windows.test( ua );

		/**
		 * 是否Linux操作系统：是为true，否为false
		 */
		jBrowser.linux = _linux.test( ua ) && (!/android/i.test(ua));

		/**
		 * 是否MAC操作系统：是为true，否为false
		 */
		jBrowser.mac = _mac.test( ua );
		
		/**
		 * 是否Android操作系统：是为true，否为false
		 */
		jBrowser.android = _android.test( ua );
		
		/**
		 * 是否iPhone操作系统：是为true，否为false
		 */
		jBrowser.iphone = _iphone.test( ua );
		
		/**
		 * 是否iPad操作系统：是为true，否为false
		 */
		jBrowser.ipad = _ipad.test( ua );
		
		/**
		 * 是否IOS操作系统：是为true，否为false
		 */
		jBrowser.ios = _ios.test( ua );
		
		// jBrowser原型链扩展
		jBrowser.fn.init.prototype = jBrowser.fn;
		
		return jBrowser;
		
	})();
	
	// 将jBrowser设置为Global全局对象
	window.jBrowser = jBrowser;
	if(!window.jB){//若全局中未存在jB，则jB是jBrowser的别名，即此时使用jB等同于使用jBrowser
		window.jB = jBrowser;
	}
	if(!window.jB$){//若全局中未存在jB$，则jB$是jBrowser的别名，即此时使用jB$等同于使用jBrowser
		window.jB$ = jBrowser;
	}
	if(!window.b$){//若全局中未存在b$，则b$是jBrowser的别名，即此时使用b$等同于使用jBrowser
		window.b$ = jBrowser;
	}
	
})(window);
